import router from "@/router";
import store from "@/store";
import axios from "axios";
import { Toast } from "vant";
// 创建一个新的axios实例对象
const request = axios.create({
  baseURL: "http://toutiao.itheima.net/v1_0",
});
// 请求拦截器：在请求拦截器上设置请求携带请求头
request.interceptors.request.use(function(config) {
  // 如果vuex中有token就携带token
  const user = store.state.user;    
  if (user.tokens && user.tokens.token && !config.headers.Authorization) {
    config.headers.Authorization = `Bearer ${user.tokens.token}`;
  }
  //config:配置对象，对象里header属性表示请求头
  return config;
},function(error){
    return Promise.reject(error)
});
// 响应拦截器：1.判断登录是否成功2.处理过期token
request.interceptors.response.use(
  function(response)  {
    // 2xx范围的状态码都会触发函数
    return response.data || response;
  },
  async function (error)  {
    //响应失败的回调函数
    if (error.response) {
      // 判断token是否过期
      if (error.response.status == 401) {
        // 用refresh_token自动刷新
        // 1.判断vuex中有没有refresh_token
        const tokens = store.state.user.tokens;
        if (tokens && tokens.refresh_token) {
          // 2.使用refresh_token调接口获取最新的token
          try {
            const res= await request({
              url: "/authorizations",
              method: "PUT",
              headers: {
                Authorization: `Bearer ${tokens.refresh_token}`,
              },
            })
              store.commit("SETTOKEN", {
                token: res.data.token,
                refresh_token: tokens.refresh_token,
              });
            error.config.headers.Authorization=''
            // 再次发起请求
            return request(error.config);
          } catch (error) {
            // refreh_token也过期了
            store.commit("SETTOKEN", null);
            // 路由跳转
            router.push("/login");
          }
        } else {
          store.commit("SETTOKEN", null);
          // 路由跳转
          router.push("/login");
        }
      }
      Toast.fail(error.response.data.message);
    } else {
      Toast.fail("网络错误");
    }
    return Promise.reject(error);
  }
);

// request.interceptors.response.use((response)=>{
//     // 2xx范围的状态码都会触发函数
//     return response.data || response
//     },(error)=>{
//     //响应失败的回调函数
//     if(error.response){
//         // 判断token是否过期
//         if(error.response.status == 401){
//             store.commit('SETTOKEN',null)
//             // 路由跳转
//             router.push('/login')
//         }
//         Toast.fail(error.response.data.message)
//     }else{
//         Toast.fail('网络错误')
//     }
//     return Promise.reject(error)
// })
export default request;
